#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行，
#第2行注释表示.py文件本身使用标准UTF-8编码：
from hello import Hello
print('#############元组类#############')
#动态语言和静态语言最大的不同，就是函数和类的定义，不是编译时定义的，而是运行时动态创建的。
h=Hello()
h.hello("wangyk")
print('type(h)',type(h))
#type()函数既可以返回一个对象的类型，又可以创建出新的类型
#要创建一个class对象，type()函数依次传入3个参数：
#    class的名称；
#    继承的父类集合，注意Python支持多重继承，如果只有一个父类，别忘了tuple的单元素写法；
#    class的方法名称与函数绑定，这里我们把函数fn绑定到方法名hello上。
def fn(name="default"):
    print("hello %s " % name)
hello=type('Hello', (object,), dict(hello=fn))
print(hello)
print(hello.hello("wangyk"))
#除了使用type()动态创建类以外，要控制类的创建行为，还可以使用metaclass。
#先定义metaclass，就可以创建类，最后创建实例。
# metaclass是类的模板，所以必须从`type`类型派生：
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
    pass
#__new__()方法接收到的参数依次是：
#    当前准备创建的类的对象；
#    类的名字；
#    类继承的父类集合；
#    类的方法集合。
L=MyList()
L.add(1)
L.append(2)
print(L)
L=list()
#L.add(1)#没有add方法
#ORM就是一个典型的例子。
#ORM全称“Object Relational Mapping”，即对象-关系映射，就是把关系数据库的一行映射为一个对象，也就是一个类对应一个表，这样，写代码更简单，不用直接操作SQL语句。
#要编写一个ORM框架，所有的类都只能动态定义，因为只有使用者才能根据表的结构定义出对应的类来。
